<?php

namespace App\Console\Commands;

use App\Models\Fresh;
use App\Models\News;
use Illuminate\Console\Command;
use App\Service\Log\LogFile;

class Hello extends Command
{
    /**
     * hello 测试（可以重复执行）
     *
     * 请求：
     *  php artisan command:hello
     *  sudo -u www php /www/wwwroot/slh/laravel.test/artisan command:hello
     *  sudo -u www php /www/wwwroot/shenlanhui/laravel/artisan command:hello
     *
     */
    /**
     * 参数与选项的区别
     *      在执行命令时，参数必须严格按定义时的顺序输入，不需输入参数名，只需输入参数的值即可。
     *      输入选项则必须带选项名，且选项名前须加 -- 前缀（选项简写字母前加 -），选项可按任意顺序输入
     */

    // 请求 以及参数
    // protected $signature = 'command:name {param1} {param2}';  // 必填参数
    // protected $signature = 'command:name {参数名?} {参数名=默认值} {参数名? : 参数说明}';  // 可选参数
    // protected $signature = 'command:name {--选项名} {--选项名=} {--选项名=默认值} {--简写字母|选项名} {--选项名 : 选项说明}';  // 选项
    protected $signature = 'command:hello';


    protected $description = '测试';

    public function __construct()
    {
        parent::__construct();
    }

    // 执行命令 保存数据库缓存以及缓存数据的修改
    public function handle4()
    {
        // 获取数据
        $id      = '406';
        $freshDb = new Fresh();
        $info    = $freshDb->isCache(true)->oneFind(['id' => $id]);
        $info    = is_object($info) ? $info->toArray() : $info;
        $this->line('输出缓存信息：'.$info['read_no']);
        var_dump($freshDb->getLastSql());


        // 修改数据
        $add = "+5";
        $this->line('修改缓存信息：'.$add);
        $freshDb->reSaveCache($id, ['read_no' => $add]);

        // 重新展示数据
        $info = $freshDb->isCache(true)->oneFind(['id' => $id]);
        $info = is_object($info) ? $info->toArray() : $info;
        $this->line('重新输出缓存信息：'.$info['read_no']);
        var_dump($freshDb->getLastSql());
    }

    // 执行的命令
    // 各种输出
    public function handle()
    {
        // 输出信息
        $this->line('准备各种颜色的输出信息');
        $this->line('line <info>info</info> <error>error</error> <comment>comment</comment> <question>question</question>');
        $this->info('This is info');
        $this->error('This is error');
        $this->comment('This is comment');
        $this->question('This is question');
        $this->line("1\n2\n");

        // $logger = new LogFile();
        //  $logger->write($request->input(), 'param');

        // Log::info('command:name命令执行 | 这里是命令任务');

        // exec("chown newuser:newgroup /path/to/directory");
        $ds    = DIRECTORY_SEPARATOR;
        $path1 = app()->storagePath().$ds.'Runtime1'.$ds.'bang'.$ds;
        $path2 = app()->storagePath().$ds.'Runtime2'.$ds.'bang'.$ds;
        $path3 = app()->storagePath().$ds.'Runtime2'.$ds;
        mkdir($path1, 0755, true);
        mkdir($path2, 0755, true);


        if(strtoupper(PHP_OS) == 'LINUX'){
            // 在这里执行 Linux 特定的操作
            var_dump(PHP_OS);
            exec("chown -R www:www ".app()->basePath());
            //exec("chown -R www:www ".$path3);
        }


        return true; // return 语句是不会展示出来的
    }

    // 交互
    public function handle2()
    {
        // 询问交互：明文
        //$name = $this->ask('<info>What is your name?</info>');
        //$name = $this->ask('<question>What is your name?</question>');
        //echo $name;

        // 询问交互：密码（不可见）
        //$password = $this->secret('What is the password?');
        //echo $password;

        // 如果 输入 y/yes 则执行里面的程序
        /*if ($this->confirm('Try again?')) {
            echo 'do it again';
        }*/

        // 自动补全(具体功能未知)
        // $from = $this->anticipate('where are you from?', ['Beijing', 'Shanghai']);
        // echo $from;

        // 选项
        // $array  = ['male', 'female'];
        // $gender = $this->choice('What is your gender?', $array, 0);
        // echo $gender;

        return 0;
    }

    // 参数与选项
    public function _handle()
    {
        // 参数
        echo $text = $this->argument('text');
        echo chr(10);
        $all = $this->argument();
        var_dump($all);
        echo chr(10);

        // 选项
        $option = $this->option('show');
        echo $option;
        echo chr(10);


        echo '测试';
        $this->info("md5('{测试}') = 测试");   // 输出

        return 0;
    }

}
